package aceim.app;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import aceim.api.service.ApiConstants;
import aceim.api.utils.Logger;
import aceim.api.utils.Logger.LoggerLevel;
import aceim.app.dataentity.SmileyResources;
import aceim.app.utils.PluginsManager;
import aceim.app.view.page.chat.SmileysPopup;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.widget.EditText;
public class SmileysManager extends PluginsManager {
private SortedMap<String, Drawable> mManagedSmileysCache = null;
private final Map<String, SmileyResources> mResources = new LinkedHashMap<String, SmileyResources>();
private static SmileysPopup sSmileysPopup;
public SmileysManager(MainActivity activity) {
super(activity, ApiConstants.ACTION_PLUGIN_SMILEYS);
mResources.put(activity.getPackageName(), SmileyResources.mySmileys(activity));
initSmileys();
}
private void initSmileys() {
Logger.log("Init smileys", LoggerLevel.VERBOSE);
PackageManager packageManager = mContext.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(PackageManager.GET_RESOLVED_FILTER);
for (PackageInfo i : list) {
if (i.packageName.startsWith(ApiConstants.ACTION_PLUGIN_SMILEYS)) {
Logger.log("Smiley pack info: " + i);
addSmileyPackage(i.packageName);
}
}
}
@Override
protected void onPackageAdded(String packageName) {
addSmileyPackage(packageName);
resetSmileysPopup();
}
private void removeSmileyPackage(String packageName) {
mResources.remove(packageName);
resetSmileysPopup();
}
private void addSmileyPackage(String packageName) {
if (mResources.containsKey(packageName)) {
removeSmileyPackage(packageName);
}
SmileyResources r = SmileyResources.fromPackageName(packageName, mContext);
mResources.put(packageName, r);
}
@Override
protected void onPackageRemoved(String packageName) {
removeSmileyPackage(packageName);
}
protected MainActivity getMainActivity() {
return (MainActivity) mContext;
}
/**
* @return the mResources
*/
public Map<String, SmileyResources> getResources() {
return mResources;
}
private SortedMap<String, Drawable> manageSmileys() {
if (mManagedSmileysCache == null) {
mManagedSmileysCache = new TreeMap<String, Drawable>(new StringLengthComparator());
List<SmileyResources> smileys = new ArrayList<SmileyResources>(mResources.values());
for (int k=smileys.size()-1; k>=0; k--) {
SmileyResources smr = smileys.get(k);
try {
Resources res = smr.getNativeResourcesForProtocol(getMainActivity().getPackageManager());
for (int i = 0; i < smr.getDrawableIDs().length; i++) {
String smiley = smr.getNames()[i];
if (!mManagedSmileysCache.containsKey(smiley)) {
mManagedSmileysCache.put(smiley, res.getDrawable(smr.getDrawableIDs()[i]));
}
}
} catch (Exception e) {
Logger.log(e);
}
}
}
return mManagedSmileysCache;
}
/**
* @return the sSmileysPopup
*/
public SmileysPopup getSmileysPopup() {
if (sSmileysPopup == null) {
sSmileysPopup = new SmileysPopup((MainActivity) mContext);
}
return sSmileysPopup;
}
public void resetSmileysPopup() {
if (sSmileysPopup != null) {
sSmileysPopup.hide();
sSmileysPopup = null;
}
}
/**
* @return the mSmileysManager
*/
public Collection<SmileyResources> getUnmanagedSmileys() {
return getResources().values();
}
public SortedMap<String, Drawable> getManagedSmileys() {
return manageSmileys();
}
public Collection<SmileyResources> getThirdPartySmileys() {
List<SmileyResources> unmanaged = new ArrayList<SmileyResources>(getUnmanagedSmileys());
unmanaged.remove(0);
return Collections.unmodifiableList(unmanaged);
}
private static final class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String rhs, String lhs) {
if (lhs != null && rhs != null) {
if (lhs.length() != rhs.length()) {
return lhs.length() - rhs.length();
} else {
return lhs.compareTo(rhs);
}
} else {
return lhs != null ? 1 : -1;
}
}
}
public boolean isPopupShown() {
return sSmileysPopup != null && sSmileysPopup.isShown();
}
public void hidePopup() {
if (isPopupShown()) {
sSmileysPopup.hide();
}
}
public void showPopup(EditText mEditor) {
if (sSmileysPopup == null) {
sSmileysPopup = new SmileysPopup(getMainActivity());
}
sSmileysPopup.show(mEditor);
}
}